/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GameAI;

import GameObject.Card;
import GameObject.Effect;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.List;
import java.util.Timer;

/**
 * Lớp Player đại diện cho một người chơi cụ thể 
 * @author NGUYEN VAN TAM
 */
public class Player {
    // thông tin xác thực của một người chơi
    public String _ID;
    public String _name;
    // người chơi đứng thứ mấy trong lượt đi của một vòng
    public int _indexStart;
    // người chơi đang ở trạng tháI được phép playing tức là được chọn bài 
    public boolean _playingStart;
    public int _score;
    public SettingGameAI.Direction _direction;
    // vị trí các lá bài sẽ được thu về
    public Point _positionRecieveCard;
    
    // Danh sách các lá bài mà người chơi đang nắm giữ
    public List<Card> lcardHidden;
    public List<Card> lcardShow;
    // Hiệu ứng cho người chơi 
    public List<Effect> leffect;
        
    // Nếu như không có lá bài nào được chọn 
    // không có lá bài nào đang move thi sẽ tiến hanh sort lại
    MovingController movingController;
    SortingController sortingController;
    SelectingController selectingController;

    //những thuộc tính mêu tã lại trang thái mà player quan sát được từ người khác và từ trung tâm
    public Player West;
    public Player North;
    public Player East;
    public CenterPlayer center;
    
    //khởi tạo cái tầm nhìn cho người chơi
    public void InitPlayer(Player w,Player n, Player e, CenterPlayer c)
    {
        West = w;
        North = n;
        East = e;
        center = c;
    }
    
    // Khởi tạo số lượng Card ban đầu cho Player
    public void InitCard(List<Card> cardHidden, List<Card> cardShow, List<Effect> effect)
    {
        lcardHidden = cardHidden;
        lcardShow = cardShow;
        leffect = effect;
    }
    
    // Khởi tạo các điều khiển cho Player
    public void InitControllerAI(MovingController moveController,SortingController sortController, SelectingController selectController)
    {
        movingController = moveController;
        sortingController = sortController;
        selectingController = selectController;
    }
    
    // Khởi tạo những thông tin xác thực người chơi
    public void InitPrivateInfo(String id, String name, int indexStart, boolean playingStart, int score, SettingGameAI.Direction direction, Point positionRecieveCard)
    {
        _ID = id;
        _name = name;
        _indexStart = indexStart;
        _playingStart = playingStart;
        _score = score;
        _direction = direction;
        _positionRecieveCard = positionRecieveCard;
    }    
    
    // Khởi tạo thông tin người chơi từ chuổi xml
    public void Init(String xml)
    {
        
    }
    
    // trong lúc cho phép người chơi đi 
    // đã tạo ra một số ID, xác định mã gói tin mà người chơi gừi đi server, chuyễn cho các người chơi khác
    // thì tùy theo mã gói tin, mã IDPlayer mà sẽ phân tích chuổi xml để nhận thông điệp
    // Tạo thông tin thay đổi là một chuôi xml nếu là người chơi chính
    // action được setting trong SettingGameAI
    public String CreateInfoChange(List<Card> l_card, int action)
    {
        String result = "<INFO>" + 
                          "<IDPLAYER>" +
                            this._ID+
                          "</IDPLAYER>" +
                          "<ACTION>" + 
                                action + 
                          "</ACTION>";// +
                        //"</INFO>"    ;
        
        for(int i = 0; i < l_card.size();i++)
        {
            result += "<CARD>" +
                        "<TYPE>" + 
                            l_card.get(i)._attributes._cardtype + 
                        "</TYPE>" +
                        "<VALUE>" + 
                            l_card.get(i)._attributes._value + 
                        "</VALUE>" +
                     "</CARD>";
        }
        return result;
    }
    
    // Gửi thông tin thay đổi nếu là người chơi chính
    public  String SendMessageInfoChange(String message)
    {
        return null;
    }

    // Nhận thông tin thay đổi là nước đi kế tiếp nếu không là người chơi chính
    public boolean RecieveMessageInfoChange(String message)
    {
        return false;
    }
    
    // cập nhật lại thông tin các lá bài cần hiển thị các lá bài nào ăn
    // cập nhật thông tin bước đi được nhận từ server 
    public void Update(Timer gameTime)
    {
        sortingController.Sort();
        movingController.Move();
        int n = lcardShow.size();
        for (int i = n - 1; i > 0; i--)
        {
            lcardShow.get(i).Update(gameTime);
            if(_direction == SettingGameAI.Direction.West && lcardShow.get(i).x + lcardShow.get(i).width <= _positionRecieveCard.x)
            {
                lcardHidden.add(lcardShow.get(i));
            }
            else if(_direction == SettingGameAI.Direction.East && lcardShow.get(i).x  >= _positionRecieveCard.x)
            {
                lcardHidden.add(lcardShow.get(i));
            }
            else if(_direction == SettingGameAI.Direction.South && lcardShow.get(i).y + lcardShow.get(i).height <= _positionRecieveCard.y)
            {
                lcardHidden.add(lcardShow.get(i));
            }
            else if(_direction == SettingGameAI.Direction.South && lcardShow.get(i).y  >= _positionRecieveCard.y)
            {
                lcardHidden.add(lcardShow.get(i));
            }
        }
    }
    
    // vẽ ra danh sách các lá bài mà người chơi hiện có
    public void Draw(Timer gameTime,Graphics2D graphic)
    {
        for (int i = 0; i < lcardShow.size(); i++)
        {
            lcardShow.get(i).Draw(gameTime,graphic);
        }
        for (int i = 0; i < leffect.size(); i++)
        {
            leffect.get(i).Draw(gameTime,graphic);
        }
    }
    
    // Nhận một lá bài
    public void RecieveCard(Card _card, Point pointDes)
    {
        lcardShow.add(_card);
        movingController.AddMovingCard(_card, pointDes);
        movingController._des.add(pointDes);
    }
    
    // đánh một lá bài đi ra, vị trí của player luôn là vị trí phía north in sơ đồ người chơi
    public void PlayCard(Card _card, Point point)
    {
        // sau khi đánh song remove nó ra khỏi lShowCard
        center.ReceiveCard(_card, _direction);
    }
}
